
import * as effectTypes from './effectTypes'
/**
 * 接收 saga 并运行这个 saga
 * @param {*} saga 
 */
function runSaga(env, saga) {
  debugger
  const { channel, dispatch } = env

  let it = typeof saga === 'function' ? saga() : saga
  function next() {
    let {
      done,
      value: effect,
    } = it.next()

    if (!done) { // !false 代表当前生成器 没有执行完毕
      if (typeof effect[Symbol.iterator] == 'function') { // 处理子saga情况
        runSaga(env, effect) // 产出的指令对象是一个迭代器对象
        next() // 当前的 saga 会继续执行
      } else if (effect instanceof Promise) {
        effect.then(next)
      } else {
        switch (effect.type) {
          case effectTypes.TAKE: { // 监听一个动作
            channel.once(effect.actionType, next) // 监听一个动作 ( 只监听一次 )
            break;
          }
          case effectTypes.PUT: { // 向仓库派发一个动作
            dispatch(effect.action)
            next()
            break;
          }
          default: {
            break;
          }
        }
      }
    }
  }

  next()
}

export default runSaga
